/***************************************************************************
 *   Copyright (C) 2007 by Alexandre Masselot,,,   *
 *   alex@alex-laptop   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU Library General Public License as       *
 *   published by the Free Software Foundation; either version 2 of the    *
 *   License, or (at your option) any later version.                       *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU Library General Public     *
 *   License along with this program; if not, write to the                 *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include "peptidemsmsfactory.h"

namespace bol{

void PeptideMSMSFactory::createPeptides(Peptide& src, vector<Peptide>& vpept){
  Peptide tmppept(src);
  int l=tmppept.length();
  for(unsigned char*c=tmppept.sequence(); *c; c++){
    *c=aacyclestart[*c];
  }
  int dir=+1;
  for(unsigned char*c=tmppept.sequence(); c>=tmppept.sequence(); ){
    //cout<<(int)*c<<"["<<(c-tmppept.sequence())<<"]("<<dir<<")"<<endl;
    if(!*c){
      vpept.push_back(Peptide(tmppept));
      dir=-1;
    }
    if(dir>0){
      c++;
    }else{
      c--;
      if(c<tmppept.sequence())
         continue;
      if(aacycle[*c]>*c){
        *c=aacycle[*c];
        dir=+1;
      }else{
        *c=aacycle[*c];
      }
    }
  }
}

void PeptideMSMSFactory::setPeptideModifier(PeptideModifier* theValue){
  PeptideFactory::setPeptideModifier(theValue);
  for (int i=0; i<256; i++){
    aacycle[i]=0;
    aacyclestart[i]=0;
  }
  for(int i=1; i<29; i++){
    unsigned char* cmap=peptideModifier()->charMapper()[i];
    if(!cmap)
      continue;
    aacyclestart[i]=cmap[0];
    unsigned char *c;
    for(c=cmap; *c;){
      aacycle[*c]=*(++c);
    }
    c--;
    aacycle[*c]=cmap[0];
  }
}
}

